package com.gujiangbo.oom;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;

/**
 * @Author: gujiangbo.co
 * @Contact: 646832012@qq.com
 * @Date: 2022/3/13 09:05
 * @Version: 1.0
 * @Description: JVM参数
 * -XX:MetaspaceSize=8m -XX:MaxMetaspaceSize=8m
 * 在java8以后的版本使用Mataspace来代替永久代
 * Metaspace是方法区在HotSpot中的实现，它与持久代最大的区别在于：Metaspace并不在虚拟机内存中而是使用本地内存，
 * 也即在java8中，被存储在叫做metaspace的native memory
 * <p>
 * 永久代 存放了以下信息：
 * 虚拟机加载的类信息
 * 常量池
 * 静态变量
 * 及时编译后的代码
 * <p>
 * 模拟Metaspace空间溢出，我们不断生成类往元空间注入，类占据的空间总是会超过Metaspace指定的空间大小的
 */
public class JavaMetaSpace {
    static class OOMT {
    }

    public static void main(String[] args) {
        for (; ; ) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(OOMT.class);
            enhancer.setUseCache(false);
            enhancer.setCallback((MethodInterceptor) (o, method, objects, methodProxy) -> methodProxy.invoke(o, args));
            enhancer.create();
        }
    }
}

